#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from catlex import *
from analex import *
from error import *
from arbol import *
import sys

class analizador_sintactico:
    def __init__(self, analizador_sintactico):
        self.lex = analizador_sintactico
    
    def Linea(self):
        arbol_str = None
        if self.lex.siguiente_componente().cat == cat.nl:
            pass
        else:
            arbol_str = self.Suma()
        self.lex.avanza()
        
        if self.lex.siguiente_componente().cat == cat.nl:
            raise ErrorSintactico("Error en el análisis de la línea")
        
        return arbol_str
    
    def Suma(self):
        arbol_str = self.Producto()
        while self.lex.siguiente_componente().cat == cat.suma:
            self.lex.avanza()
            sumando = self.Producto()
            arbol_str = ArbolSuma(arbol_str, sumando)
        return arbol_str
    
    def Producto(self):
        arbol_str = self.Factor()
        while self.lex.siguiente_componente().cat == cat.producto:
            self.lex.avanza()
            factor = self.Factor()
            arbol_str = ArbolProducto(arbol_str, factor)
        return arbol_str
    
    def Factor(self):
        arbol_str = None
        if self.lex.siguiente_componente().cat == cat.abre:
            self.lex.avanza()
            arbol_str = self.Suma()
            if self.lex.siguiente_componente().cat != cat.cierra:
                raise ErrorSintactico("se debería cerrar el paréntesis")
            self.lex.avanza()
        elif self.lex.siguiente_componente().cat == cat.entero:
            arbol_str = ArbolEntero(self.lex.siguiente_componente())
            self.lex.avanza()
        else:
            raise ErrorSintactico("se esperaba un entero o una operación entre paréntesis")
        return arbol_str
            
    
    